2020-11-16-Methodologies for Quantifying (Re-)randomization Security and Timing under JIT-ROP
会议:CCS’20
论文名称:Methodologies for Quantifying (Re-)randomization Security and Timing under JIT-ROP
Introduction
linux中的ASLR属于Coarse-grained ASLR,其只会将module/segment作为整体进行随机化,然而攻击者只需要泄露出module中的一个地址,就可以知道该module的基地址,从而可以在ROP时利用整个模块中的gadget。
因此,安全研究人员设计出了多种Fine-grained ASLR,即以functions、basic blocks、instructions、machine register为粒度进行随机化,以缓解ROP类攻击。再后来,又出现了re-randomization的方案,即每间隔一定时间就重新进行随机化,以减小攻击者的时间窗口。
本文提出了一种量化评估上述随机化方案的安全性及re-randomization中间隔时间的方法。
作者的贡献包含以下几个方面:
- 提供了一种测量JIT-ROP gadget可用性、质量和图灵完备的方法
- 提供了一种对于re-randomization间隔时间上界$\tau$的计算方法,经过对nginx, proftpd, firefox等应用程序的测试,$\tau$的范围在1.5~3.5s。
- 发现了在fine-grained ASLR的场景下,无论用于漏露的起始代码指针在哪里,通过JIT-ROP的方式泄露gadget,泄露出的gadget集合的收敛相同。而起始代码指针的位置与收敛的速度有关。
- 提出了一种量化JIT-ROP gadget数量的通用量化方法。并在实验中发现单轮的instruction-level的随机化方案能够减少约90%可用gadget数量。研究发现相比与堆和data段,更容易通过栈泄露出libc的地址,栈中平均包含16个指向libc的指针。
传统ROP和JIT-ROP的区别
(假设攻击者可以控制一个指针,可以泄露代码段的数据)为了绕过coarse- and fine-grained ASLR以进行利用,传统ROP和JIT-ROP需要通过以下步骤:
可以看到,攻击的流程主要分为三个部分:memory layout derandomization, system access, and payload generation。
Memory Layout Derandomization
Basic ROP
由于Coarse-grained ASLR只能以module/segment的粒度进行随机化,因此攻击者只需要leak出指向module内部的一个地址即可计算出module的基地址,从而根据预先设置的偏移找到gadgets。
Just-in-time ROP
Fine-grained ASLR会对code page进行随机化,因此不可能通过线性扫描的方式去探索code page(因为可能读到unmapped memory)。研究人员在2013年JIT-ROP中提出了一种递归下降的code page探索方法,攻击者可以控制一个指向code page的指针,通过这个指针,不断的去检测call jmp指令的跳转地址,从而发现新的code page。如下图所示:
System Access
攻击者进行ROP的目的是要获得特权操作,如getshell、文件读写等。因此,通常情况下攻击者需要利用系统API或syscall gadgets组成ROP chain完成利用。由于fine-grained ASLR,JIT-ROP收集gadget的过程比传统ROP繁琐。
Payload Generation
攻击者将gadgets组合起来,生成ROP chain,将ROP chain存入程序的堆栈、data段,通过stack pivoting等方式触发ROP攻击。
值得注意的是,由于漏洞程序中用于存ROP chain的空间可能有限、构造ROP chain需要花费较大的精力,攻击者通常希望能够构造出“简洁明了”、“副作用较小”的ROP chain。即尽可能使用有且仅有核心功能的,不包含其他更改程序状态指令的gadget。作者将gadget的副作用称为footprint。
Threat Model
- 实验环境中开启了ASLR:
- Coarse-grained ASLR
- Fine-grained ASLR
- 标准的W⊕X 和 RELRO均开启,由于作者关注ASLR这种防御机制的安全性,因此不考虑CFI、Code Pointer Integrity (CPI)
- 假设攻击者已经获得了一个泄露出来的code pointer
ASR(USENIX Security’12)[paper][slides]:
Function-level
在IR上对代码进行一些变换(函数位置、函数间隔、基本块顺序、结构体字段间隔&顺序…)
Shuffler(OSDI’16)[paper][slides]:
Function-level re-randomization
用一个独立的线程进行代码拷贝;函数地址为index,真实地址保存在%gs寄存器指向的内存区域中;栈上的返回地址用xor加密。
ILR(S&P’12)[paper]
Instruction-level randomization
静态重写;指令打散;通过Fallthrough Map记录执行顺序;通过process-level virtual machine (PVM)执行
Definition
- 作者为gadget进行了分类,Turing-complete(TC) gadget set, priority gadget set, MOV TC gadget set
- Turing-complete(TC) gadget set:包含了访存、赋值、算术、逻辑操作,分支、函数调用、系统调用操作
- 一定需要找到图灵完备的gadget set才能进行ROP攻击吗?
- priority gadget set:作者从Metasploit中挑选出的10个最常用的gadgets
- MOV TC gadget set:x86中的mov指令是图灵完备的。Proof
- payload gadget set:三个real-world ROP payload中使用的gadget
- re-randomization的间隔时间上界$\tau$,即攻击者无法在长度为$\tau$的时间内获得Turing-complete gadget set, priority gadget set, MOV TC gadget set, or payload gadget set中的任何一个gadget集合。
- Extended footprint gadgets:gadget中出核心指令外,包含会对其他寄存器/内存状态产生影响的指令
- Minimum footprint gadgets:没有副作用的gadget
Measurement Methodologies
作者主要针对ROP攻击的三个主要阶段进行了评估,提供了方法论。
Gadget selection
作者对gadget进行了分类:
Derandomization
- challenge:如何量化fine-grained代码随机化的影响
- 解决:统计代码随机化后各种gadget数量
- 对于单轮fine-grained代码随机化的方案,统计上述各种gadget出现的数量。
- 对于re-randomization代码随机化的方案,作者选取100个re-randomized后连续的地址空间snapshot进行手动分析。
System Access
作者通过统计可用的system gadget和在堆栈、data段中vulnerable library pointers的数量,来量化访问privileged operations的难度。
Payload Generation
作者通过测量单个gadget的质量以评估生存gadget chain的质量。作者通过register corruption analysis的方式来评价单个gadget的质量。
Register corruption analysis
一个gadget中包含一条核心指令,如下图中的mov eax, edx。如果在核心指令前src寄存器edx被破坏、在核心指令后dst寄存器eax被破坏,那么认为这个gadget是损坏的。
Evaluation
作者从Re-randomization间隔时间上界、指针泄漏位置的影响、对gadget可用性的影响、运行开销的影响、gadget chain质量的影响和获得libc指针的难易程度这六个方面,对应用在多个应用程序、库上的数种随机化方案进行评估。
Gadgets set选取:包含11中类型指令的图灵完备gadget set、10个Metasploit中最常用的gadgets、7个MOV TC集合、三个realworld payload中使用的gadgets。
Re-randomization间隔时间上界
Leak 出各个类型gadgets所需要的最少时间、平均时间:
11种指令类型图灵完备gadgets set泄露所需要的时间:
初始泄露指针位置的影响
结论:对泄露出的gadgets完整集合没有影响,对泄露所需的时间有影响
对gadgets可用性的影响
作者通过分析程序应用fine-grained single-round randomization后各类型gadget数量,来量化随机化方案对gadgets可用性的影响。
指令级随机化减少了80%-90%的MIN-FP、EX-FP。
对gadget chain质量的影响
通过对每个gadget进行register corruption analysis,来衡量这个gadget的质量。
Libc指针可用性
作者测量了libc指针在栈、堆、data段的分布,发现栈上的libc指针数量远大于堆、data段数量只和,因此作者认为更有必要对栈进行进一步的保护。
总结
作者提出了在JIT-ROP威胁模型下对ASLR安全性进行量化评估的方法,并对多款随机化方案应用在多个应用上的安全性进行了评估。
主要测量了各种gadget的数量和质量,以及re-randomization时间上界。